package com.xuzhao.controller;

import com.xuzhao.entity.Person;
import com.xuzhao.entity.Result;
import com.xuzhao.enums.ResultEnum;
import com.xuzhao.service.PersonService;

import com.xuzhao.utils.ResultUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import javax.validation.Valid;
import java.util.List;

/**
 * Created by xz on 2017/9/5.
 */
@RestController
public class PersonController {

    private final static Logger logger = LoggerFactory.getLogger(PersonController.class);
    @Autowired
    private PersonService personService;

    /**直接接收类这样将参数封装起来，这块代码后期都可以不动
         还可以加验证，返回验证信息
     使用PUT属性要使用 x-www-form-urlencoded，不能使用form-data提交数据
         使用postMan工具添加参数 参数名是类的属性名 选择PUT方式
     服务器请求地址是:http://127.0.0.1/person
     在postMan下查看结果，成功的话会返回添加的Peron对象

     ---------------@Valid 验证实体属性,BindingResult --->>>绑定消息，获取验证结果，就是在类上配置的message---------------
     * @param person
     * @param result
     * @return
     */
    @PutMapping("/person")
    public Result addPerson(@Valid Person person,BindingResult result){
        if (result.hasErrors()){
            logger.error("增加错误信息--->{}",result.getFieldError().getDefaultMessage());
            return ResultUtil.eror(ResultEnum.VALIDATE_FALSE.getCode(),ResultEnum.VALIDATE_FALSE.getMsg()+":"+result.getFieldError().getDefaultMessage());
        }
        return ResultUtil.success(personService.saveOrUpdate(person));
    }
    /**
     这种是接收参数的形式@RequestParam("name") 这里的name对应前台参数的key
        使用postMan工具添加参数 参数名是类的属性名 选择PUT方式
     x-www-form-urlencoded方式
            服务器请求地址是:http://127.0.0.1/person/add
        在postMan下查看结果，成功的话会返回添加的Peron对象
     * @param name 名字
     * @param sex  性别
     * @param age  年龄
     * @return person
     */
    @PutMapping("/person/add")
    public Result addPerson1(@RequestParam("name")String name,@RequestParam("sex")String sex,@RequestParam("age")Integer age){
        Person person = new Person();
        person.setName(name);
        person.setSex(sex);
        person.setAge(age);
        return ResultUtil.success(personService.saveOrUpdate(person));
    }

    /**
     *  查询出一条信息
          使用postMan工具添加参数 参数名是类的属性名 选择GET方式
                服务器请求地址是:http://127.0.0.1/person/1   (在数据库查看刚才添加的ID)
     在postMan下查看结果，成功的话会返回添加的Peron对象

     * @param id id
     * @return
     */
    @GetMapping("/person/{id}")
    public Result findById(@PathVariable(value = "id") Integer id){
        Person person = personService.findById(id);
        if (person==null){
            return ResultUtil.eror(ResultEnum.MESSAGE_NOTFOND.getCode(),ResultEnum.MESSAGE_NOTFOND.getMsg());
        }
        return ResultUtil.success(personService.findById(id));
    }
    /**
     *  查询出所有信息
     使用postMan工具添加参数 参数名是类的属性名 选择GET方式
     服务器请求地址是:http://127.0.0.1/person/   (在数据库查看刚才添加的ID)
     在postMan下查看结果，成功的话会返回添加的Peron对象
d
     * @return
     */
    @GetMapping("/person")
    public Result findAll(){
        List<Person> personList = personService.findAll();
        if (personList==null||personList.size()<=0){
            return ResultUtil.eror(ResultEnum.MESSAGE_NOTFOND.getCode(),ResultEnum.MESSAGE_NOTFOND.getMsg());
        }
        return ResultUtil.success(personService.findAll());
    }
    /**
     *  更新一条信息
        使用postMan工具添加参数 参数名是类的属性名 选择  POST 方式
     使用的是PostMapping
             服务器请求地址是:http://127.0.0.1/person/1   (在数据库查看刚才添加要更改信息的ID)
        在postMan下查看结果，成功的话会返回添加的Peron对象
     * @param person
     * @return
     */
    @PostMapping("/person/{id}")
    public Result updateById(@PathVariable("id")Integer id, @Valid Person person, BindingResult result){
        logger.info("更改的对象是:{}"+person);
        if (result.hasErrors()){
            logger.error("增加错误信息--->{}",result.getFieldError().getDefaultMessage());
            return ResultUtil.eror(ResultEnum.VALIDATE_FALSE.getCode(),ResultEnum.VALIDATE_FALSE.getMsg()+":"+result.getFieldError().getDefaultMessage());
        }
        return ResultUtil.success( personService.saveOrUpdate(person));
    }

    /**
     *  查询出一条信息
            使用postMan工具添加参数 参数名是类的属性名 选择  DELETE 方式
        使用的是DeleteMapping
            服务器请求地址是:http://127.0.0.1/person/1   (在数据库查看刚才添加要删除信息的ID)
             在postMan下查看结果，成功的话会返回添加的Peron对象
     * @param id
     * @return
     */
    @DeleteMapping("/person/{id}")
    public Result deleteById(@PathVariable("id") Integer id)throws Exception{
        personService.deleteById(id);
        return  ResultUtil.success("删除成功");
    }
}
